package cn.bone.concurrent.demo01;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by superbone on 2017/2/12.
 *
 * 它使用了Executors的静态函数生成一个固定的线程池，顾名思义，线程池的线程是不会释放的，即使它是Idle。
 这就会产生性能问题，比如如果线程池的大小为200，当全部使用完毕后，所有的线程会继续留在池中，相应的内存和线程切换（while(true)+sleep循环）都会增加。
 如果要避免这个问题，就必须直接使用ThreadPoolExecutor()来构造。可以像通用的线程池一样设置“最大线程数”、“最小线程数”和“空闲线程keepAlive的时间”。

 */
public class MyExecutor extends Thread {

    private int index;
    public MyExecutor(int i){
        this.index = i;
    }

    public void run(){
        System.out.println("["+this.index+" start...]" + Thread.currentThread().getName());
        try {
            Thread.sleep((int)(Math.random()*10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("["+this.index+" end...]" + Thread.currentThread().getName());
    }

    public static void main(String[] args){
        ExecutorService service = Executors.newFixedThreadPool(4);
        for(int i=0;i<10;i++){
            service.execute(new MyExecutor(i));
        }
        System.out.println("submit finish");
        service.shutdown();
    }
}
